package gff.model.dao;

import gff.constantes.Constantes;
import gff.vo.InsumosVO;
import gff.vo.ReglasVO;
import gff.vo.SeparacionFuenteOrigen;
import gff.vo.UnidadesVO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;

import org.apache.log4j.Logger;


public class ConcentradoImp extends DAOUtil {

	private static final Logger log = Logger.getLogger(ConcentradoImp.class);

	private static transient Connection conn     = null;

	public static void updateFuentes(InsumosVO insumo , SeparacionFuenteOrigen separacion  , HashMap<String, ArrayList<InsumosVO>> fuentesSeparadas ,ReglasVO reglaUnidad ,UnidadesVO unidad) throws Exception {


		log.info(" CatalogosImp " + " Metodo : updateFuentes");

		ResultSet rs = null;
		PreparedStatement ps = null;
		PreparedStatement ps2 = null;

		StringBuffer sql = new StringBuffer(); 
		StringBuffer sql2 = new StringBuffer();
		

		ArrayList<InsumosVO> insumoFuente = new ArrayList<InsumosVO>();
		ArrayList<InsumosVO> insumoFuente2 = new ArrayList<InsumosVO>();

		InsumosVO  insumo2 = new InsumosVO();
		
		int origen1 = 0;
		int origen2 = 0;

		
		sql.append(" update concentrado set fuente = ? where id_med = ? and origen = 1 and unidad ="+unidad.getId() ); 


		try {


			insumo2.setClave(insumo.getClave());
			insumo2.setDescripcion(insumo.getDescripcion()																										 );
			insumo2.setFuenteModifica(insumo.getFuenteModifica());
			insumo2.setPrecio(insumo.getPrecio());
			insumo2.setDispensacion(insumo.getDispensacion());
			insumo2.setTipoMedicamento(insumo.getTipoMedicamento());

		
			conn = getConnection(Constantes.JNDGFF );
			ps = conn.prepareStatement( sql.toString() );

			ps.setString(1, insumo.getFuenteModifica() );
			ps.setString(2, insumo.getClave());

			log.info("Imprime query 1  " +  sql.toString());

			origen1 = ps.executeUpdate();

			log.info("Parametros Clave[" + insumo.getClave() + "]  Fuente[" + insumo.getClave() + "]");
			
			if (origen1 >0 && insumo.getTipoMedicamento().equals(Constantes.MEDICAMETO)){

				
				//sql.append(" update concentrado set fuente = ? where id_med = ? and origen = 1 and unidad ="+unidad.getId()); 

				
				insumo.setOrigen(Constantes.ORIGEN_SSD);
				insumo.setCantidadInsumo(String.valueOf(origen1));
				insumo.setTipo(Constantes.MEDICAMETO_DESC);
				insumo.setFuenteModifica(Constantes.FUENTE_ORIGEN_1);
				separacion.getMedOrigen1().add(insumo );
				
				insumoFuente =  fuentesSeparadas.get(Constantes.MED1 +insumo.getFuenteModifica() );
				insumo = getInfoMed(insumo, unidad);
				
				insumo.setPrecioTotal(String.valueOf(Integer.parseInt(insumo.getCantidadInsumo()) * Double.parseDouble(insumo.getPrecio())));

				
				if (unidad.getDispensa()  == Constantes.ESTATUS_DISPENSACION ){
					insumo.setTotalServicio(String.valueOf(Integer.parseInt(insumo.getCantidadInsumo()) * Double.parseDouble (insumo.getDispensacion())));
				}else{				
					insumo.setTotalServicio("0");	
				}
				 
				
				insumoFuente.add(insumo);
				
				fuentesSeparadas.put(Constantes.MED1 + insumo.getFuenteModifica() , insumoFuente);
				
				
				log.info("Tipo ["+Constantes.MEDICAMETO+"] " +" Origen ["+Constantes.ORIGEN_SSD+"] "+ " Lista Fuente [" +insumo.getFuenteModifica() + "MED1"+"]"+ " Clave [" +insumo.getClave()+"]"  );

			}


			if (origen1 >0 && insumo.getTipoMedicamento().equals(Constantes.MATERIAL)){
				insumo.setFuenteModifica(Constantes.FUENTE_ORIGEN_1);
				insumo.setOrigen(Constantes.ORIGEN_SSD);
				insumo.setCantidadInsumo(String.valueOf(origen1));
				insumo.setTipo(Constantes.MATERIAL_DESC);
				separacion.getMatOrigen1().add(insumo );
				
				insumoFuente =  fuentesSeparadas.get(Constantes.MAT1 + insumo.getFuenteModifica() );

				insumo = getInfoMed(insumo, unidad);
				
				if (reglaUnidad.getEstatusCobro() == Constantes.ESTATUS_COBRO_ACTIVADO ){				
					insumo.setPrecioTotal(String.valueOf(Integer.parseInt(insumo.getCantidadInsumo()) * Double.parseDouble(insumo.getPrecio())));
					insumo.setIva(String.valueOf((Integer.parseInt(insumo.getCantidadInsumo()) * Double.parseDouble (insumo.getPrecio())) * Constantes.iva));
					insumo.setIvaNumber((Integer.parseInt(insumo.getCantidadInsumo())  * Double.parseDouble (insumo.getPrecio())) * Constantes.iva );				

				}else{
					insumo.setPrecioTotal("0");
					insumo.setIva("0");
					insumo.setIvaNumber(0);				
				}
				
				if (unidad.getDispensa()  == Constantes.ESTATUS_DISPENSACION ){
					insumo.setTotalServicio(String.valueOf(Integer.parseInt(insumo.getCantidadInsumo()) * Double.parseDouble (insumo.getDispensacion())));
				}else{				
					insumo.setTotalServicio("0");	
				}
				
				insumoFuente.add(insumo);
				fuentesSeparadas.put(Constantes.MAT1 + insumo.getFuenteModifica() , insumoFuente);
				
				log.info("Tipo ["+Constantes.MATERIAL+"] " +" Origen ["+Constantes.ORIGEN_SSD+"] "+ " Lista Fuente [" +insumo.getFuenteModifica() + "MAT1"+"]" + " Clave [" +insumo.getClave()+"]" );

			}

			sql2.append(" update concentrado set fuente = ? where id_med = ? and origen = 2 and unidad ="+unidad.getId()); 
			
			ps =  null;
			rs=   null;
			
			closeConnection(conn);
			
			conn = getConnection(Constantes.JNDGFF );
			ps = conn.prepareStatement( sql2.toString() );
			
			ps.setString(1, insumo2.getFuenteModifica() );
			ps.setString(2, insumo2.getClave());

			origen2 = ps.executeUpdate();

			log.info("Imprime query 2  " +  sql2.toString());
			
			if (origen2 >0 && insumo.getTipoMedicamento().equals(Constantes.MEDICAMETO)){
				
				insumo2.setOrigen(Constantes.ORIGEN_DIS);
				insumo2.setCantidadInsumo(String.valueOf(origen1));
				insumo2.setTipo(Constantes.MEDICAMETO_DESC);
			

				separacion.getMedOrigen2().add(insumo2 );

				insumoFuente2 =  fuentesSeparadas.get(Constantes.MED2 +insumo2.getFuenteModifica() );

				insumo2 = getInfoMed(insumo2, unidad);
				
				if (reglaUnidad.getEstatusCobro() == Constantes.ESTATUS_COBRO_ACTIVADO ){
					insumo2.setPrecioTotal(String.valueOf(Integer.parseInt(insumo2.getCantidadInsumo()) * Double.parseDouble(insumo2.getPrecio())));
				}else{
				
					insumo2.setPrecioTotal("0");
				}
				if (reglaUnidad.getEstatusDispensa() == Constantes.ESTATUS_DISPENSACION ){
					insumo2.setTotalServicio(String.valueOf(Integer.parseInt(insumo2.getCantidadInsumo()) * Double.parseDouble (insumo2.getDispensacion())));
				}else{				
					insumo2.setTotalServicio("0");
				}

				
				insumoFuente2.add(insumo2);
				
				fuentesSeparadas.put(Constantes.MED2 + insumo2.getFuenteModifica() , insumoFuente2);

				log.info("Tipo ["+Constantes.MEDICAMETO+"] " +" Origen ["+Constantes.ORIGEN_DIS+"] "+ " Lista Fuente [" +insumo2.getFuenteModifica() + "MED2"+"]"  +  " Clave [" +insumo2.getClave()+"]" );
			
			}

			if (origen2 >0 && insumo.getTipoMedicamento().equals(Constantes.MATERIAL)){
				insumo2.setOrigen(Constantes.ORIGEN_DIS);
				insumo2.setTipo(Constantes.MATERIAL_DESC);
				insumo2.setCantidadInsumo(String.valueOf(origen1));
				separacion.getMatOrigen2().add(insumo2 );
				
				insumoFuente2 =  fuentesSeparadas.get(Constantes.MAT2 + insumo2.getFuenteModifica() );
				
				insumo2 = getInfoMed(insumo2, unidad);
				
				
				if (reglaUnidad.getEstatusCobro() == Constantes.ESTATUS_COBRO_ACTIVADO ){				
					insumo2.setPrecioTotal(String.valueOf(Integer.parseInt(insumo2.getCantidadInsumo()) * Double.parseDouble(insumo2.getPrecio())));
					insumo2.setIva(String.valueOf((Integer.parseInt(insumo2.getCantidadInsumo()) * Double.parseDouble (insumo2.getPrecio())) * Constantes.iva));
					insumo2.setIvaNumber((Integer.parseInt(insumo2.getCantidadInsumo())  * Double.parseDouble (insumo2.getPrecio())) * Constantes.iva );				
				}else{
					insumo2.setPrecioTotal("0");
					insumo2.setIva("0");
				
				}
				
				if (reglaUnidad.getEstatusDispensa() == Constantes.ESTATUS_DISPENSACION ){
					insumo2.setTotalServicio(String.valueOf(Integer.parseInt(insumo2.getCantidadInsumo()) * Double.parseDouble (insumo2.getDispensacion())));
				}else{				
					insumo2.setTotalServicio("0");
				}
				
				insumoFuente2.add(insumo2);
				fuentesSeparadas.put(Constantes.MAT2 + insumo2.getFuenteModifica() , insumoFuente2);
				
				log.info("Tipo ["+Constantes.MATERIAL+"] " +" Origen ["+Constantes.ORIGEN_DIS+"] "+ " Lista Fuente [" +insumo2.getFuenteModifica() + "MAT2"+"]" + " Clave [" +insumo2.getClave()+"]"  );
			}
			

		} catch ( Exception e ) {
			e.printStackTrace();
			throw new Exception("Ocurrio un error en updateFuentes: " + e.getMessage());
		} finally {
			try { 
				if ( rs != null ){ 
					rs.close(); 
				}
			} catch ( SQLException e ) {
				log.error("Error al cerrar recursos de acceso a datos");
			}
			try { 
				if ( ps != null ){ 
					ps.close(); 
				}
				if ( ps2 != null ){ 
					ps.close(); 
				}
			} catch ( SQLException e ) {
				log.error("Error al cerrar recursos de acceso a datos");
			}
			closeConnection(conn);
		}

	}

	public static InsumosVO getInfoMed(InsumosVO insumo , UnidadesVO unidad ) throws Exception {


		log.info(" CatalogosImp " + " Metodo : getInfoMed");

		ResultSet rs = null;
		PreparedStatement ps = null;

		StringBuffer sql = new StringBuffer(); 

		sql.append(" select sum(can_sur)   from concentrado where origen = ? and id_med = ?  and unidad = "+ unidad.getId() +" group by id_med  "); 



		try {

			//conn = getConnection(Constantes.JNDGFF );
			ps = conn.prepareStatement( sql.toString() );
			
			ps.setString(1, insumo.getOrigen() );
			ps.setString(2, insumo.getClave());

			rs = ps.executeQuery();
			
			while (rs.next()) {
				
				insumo.setCantidadInsumo(String.valueOf(rs.getString("sum(can_sur)")));
				
			}
		
			
		} catch ( Exception e ) {
			e.printStackTrace();
			throw new Exception("Ocurrio un error en updateFuentes: " + e.getMessage());
		} finally {
			try { 
				if ( rs != null ){ 
					rs.close(); 
				}
			} catch ( SQLException e ) {
				log.error("Error al cerrar recursos de acceso a datos");
			}
			try { 
				if ( ps != null ){ 
					ps.close(); 
				}
			} catch ( SQLException e ) {
				log.error("Error al cerrar recursos de acceso a datos");
			}
			closeConnection(conn);
		}

		return insumo;
	}



}
